<?php

/**
 * Controller
 *
 * @version $Id$
 * @copyright 2006
 */
	if(!defined('APP_PATH'))
	{
		define('APP_PATH',       dirname($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']));
	}

	if(!defined('FRAMEWORK_PATH'))
	{
		define('FRAMEWORK_PATH', dirname(__FILE__));
	}

	if (!defined('DOCUMENT_APP'))
	{
		$expl = explode('/', $_SERVER['PHP_SELF']);
		array_pop($expl);
		define('DOCUMENT_APP', implode('/', $expl));
	}
	if (!defined('E_BARAKUS'))
	{
		define('E_BARAKUS', 4096);
	}

	if (!defined('E_ERROR_SUPPORTED'))
	{
		if (!defined('E_STRICT'))
		{
			define('E_STRICT', 2048);
		}
		define('E_ERROR_SUPPORTED', (E_STRICT | E_NOTICE));
	}
 	session_start();
	if (!file_exists(APP_PATH . "/Application"))
	{
		Error::ApplicationDirNotExists();
	}

	Barakus::import("Framework.Log.LogManager");
	Barakus::import("Framework.Error.Error");
	Barakus::import("Framework.Error.Backtrace");
	Barakus::import("Framework.Libs.LibManager");
	LibManager::import("Smarty.Smarty\.class");

	Barakus::import("Framework.Config.*");
	Barakus::import("Framework.Classes.*");
	Barakus::import("Framework.Request.*");

	$locale_lang = Config::get("locale_lang");
	if (!empty($locale_lang))
	{
		if (!($LLocale = setlocale(LC_TIME, $locale_lang)))
		{
			LogManager::log("No se pudo setear el Locale", L_WARNING);
		}
	}

	$app_mode = Config::get('application_mode');
    Barakus::ChangeApplicationMode($app_mode);

	class Barakus
	{
		var $Request;
		var $Session;
		var $DefaultConfig;

		function Barakus()
		{
			//$this->Request = new Request;
			//$this->Session = new Session;
			//$this->DefaultConfig = new BarakusConfig();
		}
		function init()
		{
			$this->ImportDBManager();
			$this->Pages();

			$controller = new FacadeActionController;
			$controller->execute();
		}

		function import($file, $return = false)
		{
			$file = Barakus::getPath($file);
			if (substr($file, -1) == '*')
			{
				$dir = substr($file, 0, -2);
				if (is_dir($dir))
				{
					Barakus::import_all($dir, $return);
				} else {
					if (!$return)
					{
						Error::FileNotFound($file);
					} else {
						return false;
					}
				}
			} else {
				$file .=  '.php';
				if (file_exists($file))
				{
					require_once($file);
				} else {
					if (!$return)
					{
						Error::FileNotFound($file);
					} else {
						return false;
					}
				}
			}
			return true;
		}
		function getPath($path)
		{
			$path = str_replace("\.", "\*", $path);
			$expl = explode(".", $path);
			if ($expl[0] == "Framework")
			{
				array_shift($expl);
				$ret = str_replace('\\', '/', FRAMEWORK_PATH) . '/' . implode("/", $expl);
			} else {
				$ret = str_replace('\\', '/', APP_PATH) . '/' . str_replace(".", "/", $path);
			}
			return str_replace("\*", ".", $ret);
		}
		function getApplicationPath($path)
		{
			$path = str_replace("\.", "\*", $path);
			$expl = explode(".", $path);
			return str_replace('\\', '/', DOCUMENT_APP) . '/' . str_replace(".", "/", $path);
		}
		function import_all($dir, $return = false)
		{
			if ($fd = opendir($dir))
			{
			   while (($archivo = readdir($fd)) !== false)
			   {
			   		if ($archivo != '.' && $archivo != '..' && $archivo != '.svn')
					{
			   			if (is_dir($dir . '/' . $archivo))
						{
			   				return Barakus::import_all($dir . '/' . $archivo, $return);
			   			} else {
							require_once($dir . '/' . $archivo);
						}
			   		}
			   }
			   closedir($fd);
			   return true;
			} else {
				if (!$return)
				{
					Error::CantOpenDir($dir);
				} else {
					return false;
				}
			}
		}
		function ImportDBManager()
		{
			$manager = Config::get("DBManager");
			if (!empty($manager))
			{
				Barakus::import("Framework.DB.DBManager");
			}
		}
		function Pages()
		{

		}
		function getPage()
		{
			return Request::get('page');
		}
		function lastDeclaredClass()
		{
			$array = get_declared_classes();
			if (!is_array($array))
			{
				return $array;
			}
			if (!count($array))
			{
				return null;
			}
			end($array);
			return $array[key($array)];
		}

        function ChangeApplicationMode($app_mode)
        {
			$a = Barakus::getErrorHandler(true, $app_mode);
        }

        function getErrorHandler($renew = false, $app_mode = '')
        {
        	static $ErrorInstance;

        	if (!$ErrorInstance || $renew)
        	{
        		if (!empty($app_mode))
        		{
        			$app_mode = Config::get('application_mode');
        		}

        		$ErrorHandlerClassName = Barakus::__getErrorHandlerTypeName($app_mode);
        		Barakus::import("Framework.Error." . $ErrorHandlerClassName);
        		$ErrorInstance         = new $ErrorHandlerClassName;
        	}

        	return $ErrorInstance;
		}

		function __getErrorHandlerTypeName($app_mode)
		{
    		switch($app_mode)
			{
    			case 'debug':
    				return 'ErrorDebugHandler';
    			case 'online':
    				return 'ErrorOnlineHandler';
    			//faltaria el default ERROR!
    		}
		}
	}

?>